home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 16 / CU Amiga Magazine's Super CD-ROM 16 (1997-10-16)(EMAP Images)(GB)[!][issue 1997-11].iso / CUCD / Utilities / EZCron / EZCronD < prev    next >
Text File  |  1997-06-13  |  12KB  |  345 lines

  1. /* $VER: EZCrond by Jim Hines v2.22 ©1995-1997 All Rights Reserved
  2. ** Thanks must go to Gene Heskett for his help in coding some functions.
  3. */
  4.  
  5.     csi='9b'x
  6.     Ital=csi'3m'
  7.     bold=csi'1m'
  8.     norm=csi'0m'
  9.     black=csi'31m'
  10.     white=csi'32m'
  11.     blue=csi'33m'
  12.     LF = '0a'x
  13.  
  14.     SIGNAL ON ERROR 
  15.     SIGNAL ON IOERR
  16.     SIGNAL ON SYNTAX
  17.     SIGNAL ON HALT
  18.     OPTIONS FAILAT 20
  19.     OPTIONS RESULTS
  20.  
  21.     if ~show('L','rexxsupport.library') then
  22.         call addlib('rexxsupport.library',0,-30)
  23.  
  24.     if ~exists('EZCron:prefs/config.prefs') then configfile = 't:cron.config'
  25.     else do
  26.         call open('configprefs', 'EZCron:Prefs/config.prefs', 'R')
  27.         configfile = readln('configprefs')
  28.         call close('configprefs')
  29.     end
  30.  
  31.     if exists('s:cron.config') then address command 'copy s:cron.config' configfile
  32.     else do
  33.         call rtezrequest('A config file does NOT exist.'||LF||'Use EZCron to create one.', "Okay",'EZCron Error',)
  34.         exit
  35.     end
  36.  
  37.     if showlist('P', 'EZCROND') then do
  38.         say 'Exiting EZCron... This may take several seconds.'
  39.         address 'EZCROND' STOP
  40.         exit
  41.     end
  42.     else call startrtn()
  43.  
  44.     /* =======LOOP== */
  45. startrtn:
  46.     call open('cronfile', configfile, 'R')    /* STARTUP EVENT */
  47.     do until eof('cronfile')
  48.         linein = readln('cronfile')
  49.         if pos('startup', linein, 1) > 0 then do
  50.             parse var linein command','args','ctime','cdate','startdate','enddate','rng1','rng2','sfx','txt','
  51.             if sfx ~= '' then do
  52.                 if open('sfxp','EZCron:prefs/sfx.prefs', 'R') then do
  53.                     player = readln('sfxp')
  54.                     address command 'run' player sfx
  55.                 end
  56.             end
  57.             if event = 'TEXTREMINDER' then address command 'run <>nil: rx ezcron:rexx/Reminder.rexx' txt
  58.             else address command 'run >NIL:' command args
  59.             drop linein player command args time date startdate enddate rng1 rng2 sfx txt
  60.         end
  61.     end
  62.     call close('cronfile')
  63.     call close('sfxp')
  64.  
  65.     call openport('EZCROND')
  66.     say 'Starting EZCronD v2.21'
  67.     say '©1995-97 Jim Hines'
  68.  
  69.     if showlist('P', 'EZCRONPREFS') then address 'EZCRONPREFS' refresh
  70.  
  71.     /* =======PARSE CONFIG FILE & TIMER SECTION == */
  72.     do forever
  73.         sec = right(time('N'),2)/* get seconds */
  74.         sec2 = 60 - sec            /* 60 (seconds) minus sec) */
  75.         delayvar = sec2 * 50    /* sec2 x 50 ticks or 1 second sets the delay time */
  76.         LT = delayvar / 50
  77.         LTime = 60 - LT
  78.         call delay(delayvar)    /* 3000 would be equal to 1 minute */
  79.  
  80.         pkt = getpkt('EZCROND')
  81.         if pkt ~= '0000 0000'x then call aport(pkt)
  82.  
  83.         clock = time('N')                /* 22:58:00 */
  84.         clock2 = LEFT(clock,5)            /* 22:58 */
  85.         date = Date('USA')              /*   08/04/92  */
  86.         date2 = Date('S')               /*   19920804  */
  87.         date3 = Date(W, date2, 'S')     /*   Friday    */
  88.  
  89.         event. = 0
  90.  
  91.         if ~open(cronfile, configfile,'READ') then do
  92.             exit 20
  93.         end
  94.  
  95.         errors = 0
  96.  
  97.         do until eof(cronfile)
  98.             /* Grab the line, parse the event and ignore the comments */
  99.             linein = readln(cronfile)
  100.             parse var linein line ';'
  101.             parse var line line '!'
  102.             next = event.0 + 1
  103.  
  104.             parse var line event.next.command','event.next.pargs','event.next.time',',
  105.             event.next.date','event.next.startdate','event.next.enddate',',
  106.             event.next.rng1','event.next.rng2','event.next.sfx','event.next.txt',',
  107.  
  108.             event.next.date = translate(event.next.date, 'abcdefghijklmnopqrstuvwxyz',,
  109.                             'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
  110.                             /* TRANSLATES THE DATE TO LOWERCASE IF NOT NUMERIC */
  111.             event.next.time = translate(event.next.time, 'abcdefghijklmnopqrstuvwxyz',,
  112.                             'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
  113.                             /* TRANSLATES THE TIME TO LOWERCASE IF NOT NUMERIC */
  114.             select
  115.                 when event.next.command = "" then iterate
  116.                 when event.next.command = "" then do
  117.                     errors =  1
  118.                     iterate
  119.                 end
  120.             otherwise event.0 = next
  121.             end
  122.         end  /* end of the eof loop */
  123.         call close(cronfile)
  124.  
  125.     /* ======== END OF FILE PARSE SECTION == */
  126.  
  127.         do i = 1 to event.0
  128.             parse var clock2 ahrs ':' amin            /* Actual Hrs and Mins */
  129.             parse var date amm'/'add'/'ayy            /* Actual mm dd yy */
  130.             parse var event.i.time ehrs':'emin      /* Event Hrs and Mins */
  131.             parse var event.i.date emm'/'edd'/'eyy  /* Event mm dd yy */
  132.             parse var event.i.startdate sdmm'/'sddd'/'sdyy  /* Event Startdate mm dd yy */
  133.             parse var event.i.enddate edmm'/'eddd'/'edyy  /* Event Enddate mm dd yy */
  134.  
  135.     /* ======= Misc Routines == */
  136.             if event.i.pargs = '-' then event.i.pargs = ''
  137.             if event.i.sfx = '-' then event.i.sfx = ''
  138.             if event.i.txt = '-' then event.i.txt = ''
  139.  
  140.     /* ======= Every Minute Routine == */
  141.             if event.i.time = 'minute' then event.i.time = clock2
  142.  
  143.     /* ======= Every Five Minute Routine ==  */
  144.             if (event.i.time = 'five_min' & amin // 5 = 0) then event.i.time = clock2
  145.  
  146.     /* ======= Every Ten Minute Routine ==  */
  147.             if (event.i.time = 'ten_min' & amin // 10 = 0) then event.i.time = clock2
  148.  
  149.     /* ======= Quarterly Routine == */
  150.             if (event.i.time = 'quarterly' & amin // 15 = 0) then event.i.time = clock2
  151.  
  152.     /* ======= Twenty Minute Routine == */
  153.             if (event.i.time = 'twenty_min' & amin // 20 = 0) then event.i.time = clock2
  154.  
  155.     /* ======= Every Thirty Minute Routine ==  */
  156.             if (event.i.time = 'thirty_min') & (amin = '00' | amin = '30') then event.i.time = clock2
  157.  
  158.     /* ======= Every Hour Routine == */
  159.             if amin = 00 & event.i.time = 'hourly' then event.i.time = clock2
  160.  
  161.     /* ======= Daily Routine == */
  162.             if event.i.date = 'daily' then event.i.date = date
  163.  
  164.     /* ======= Weekly Routine == */
  165.  
  166.             if event.i.date = 'sunday' & date3 = 'Sunday' then event.i.date = date
  167.             if event.i.date = 'monday' & date3 = 'Monday' then event.i.date = date
  168.             if event.i.date = 'tuesday' & date3 = 'Tuesday' then event.i.date = date
  169.             if event.i.date = 'wednesday' & date3 = 'Wednesday' then event.i.date = date
  170.             if event.i.date = 'thursday' & date3 = 'Thursday' then event.i.date = date
  171.             if event.i.date = 'friday' & date3 = 'Friday' then event.i.date = date
  172.             if event.i.date = 'saturday' & date3 = 'Saturday' then event.i.date = date
  173.  
  174.     /* ======= Weekdays Routine == The 'ol Mon-Fri routine */
  175.             if event.i.date = 'weekdays' & date3 ~= 'Sunday' & date3 ~= 'Saturday'
  176.                 then event.i.date = date
  177.  
  178.     /* ======= Weekend Routine == The ol' Sat & Sun routine */
  179.             if event.i.date = 'weekends' & date3 = 'Saturday' then event.i.date = date
  180.             if event.i.date = 'weekends' & date3 = 'Sunday' then event.i.date = date
  181.  
  182.     /* ======= Monthly Routine == */
  183.             monthevent = event.i.date
  184.             parse var monthevent mth '-' day2
  185.             if mth = 'monthly' then do
  186.                 if day2 = add & event.i.time = clock2 then event.i.date = date
  187.             end
  188.  
  189.     /* =======  4th Fri, 2nd Tue, etc routine == */
  190.             if pos('every', event.i.date, 1) > 0 then do
  191.                  parse var event.i.date var1 '_' num '_' dow  /* every 2 wed */
  192.                 del3 = date(n)   /* 20 Apr 88 */
  193.                 parse var del3 del1 cm del2
  194.                 drop del1 del2 /* dont even need them */
  195.  
  196.                 if cm = 'Jan' then cm = 31;if cm = 'Feb' then cm = 28 /* Will need to be changed for leap */
  197.                 if cm = 'Mar' then cm = 31;if cm = 'Apr' then cm = 30
  198.                 if cm = 'May' then cm = 31;if cm = 'Jun' then cm = 30
  199.                 if cm = 'Jul' then cm = 31;if cm = 'Aug' then cm = 31
  200.                 if cm = 'Sep' then cm = 30;if cm = 'Oct' then cm = 31
  201.                 if cm = 'Nov' then cm = 30;if cm = 'Dec' then cm = 31
  202.  
  203.                 countvar = 0
  204.                 do z = 1 to cm
  205.                     currdate = date(s)                /* 19951221 year month day     */
  206.                     yearmonth = left(currdate, 6)    /* 199512     year month        */
  207.  
  208.                     if z < 10 then do
  209.                         zdate = yearmonth'0'z   /* 19951201 Add the 0 back for single digit days*/
  210.                         newz = '0'z
  211.                     end
  212.                     else do
  213.                         zdate = yearmonth''z   /* 19951231 */
  214.                         newz = z
  215.                     end
  216.  
  217.                     myday = Date(W, zdate, 'S')   /* Friday   */
  218.                     myday = left(myday, 3)         /* Fri         */
  219.                     myday = translate(myday, 'abcdefghijklmnopqrstuvwxyz',,
  220.                                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ') /* fri */
  221.  
  222.                     if myday = dow then countvar = countvar + 1
  223.                     if myday = dow & countvar = num then do
  224.                         year = left(zdate, 4)             /* 1995     */
  225.                         year2 = right(year, 2)             /*   95     */
  226.                         month = right(zdate, 4)            /*     1221 */
  227.                         month2 = left(month, 2)         /*       12    */
  228.                         event.i.date = month2'/'newz'/'year2
  229.                         leave
  230.                     end
  231.                 end
  232.             end
  233.  
  234.  
  235.     /* ======= Special Time/Date Routine AF == */
  236.             if ehrs = '##' | emin = '##' then do
  237.                 if ehrs = '##' then ehrs = ahrs
  238.                 if emin = '##' then emin = amin
  239.                 event.i.time = ehrs':'emin
  240.             end
  241.  
  242.             if emm = '##' | edd = '##' | eyy = '##' then do
  243.                 if emm = '##' then emm = amm
  244.                 if edd = '##' then edd = add
  245.                 if eyy = '##' then eyy = ayy
  246.                 event.i.date = emm'/'edd'/'eyy
  247.             end
  248.  
  249.     /* ======= Time Range routine == */
  250.             if event.i.rng1 ~= '--:--' & event.i.rng2 ~= '--:--' then do
  251.                 strng = event.i.rng1
  252.                 parse var strng sthrs':'stmin
  253.                 strngdrop = 60 * sthrs
  254.                 strng = strngdrop + stmin
  255.                 endrng = event.i.rng2
  256.                 parse var endrng edhrs':'edmin
  257.                 edrngdrop = 60 * edhrs
  258.                 edrng = edrngdrop + edmin
  259.                 currtim = time(m) /* current time in minutes since midnight */
  260.                 if currtim >= strng then a = 1
  261.                 if currtim <= edrng then b = 1
  262.                 if a = 1 & b = 1 then runit = 1
  263.                 if runit ~= 1 then event.i.time = void_event
  264.                 drop strng edrng currtim a b runit
  265.             end
  266.  
  267.     /* ======= Date Range Routine == */
  268.             if event.i.startdate ~= '--/--/--' & event.i.enddate ~= '--/--/--' then do
  269.                 if pos('##', event.i.startdate, 1) > 0 | pos('##', event.i.enddate, 1) > 0 then do
  270.                     /* Start Range */
  271.                     if sdmm = '##' then sdmm = amm
  272.                     if sddd = '##' then sddd = add
  273.                     if sdyy = '##' then sdyy = ayy
  274.                     event.i.startdate = sdmm'/'sddd'/'sdyy
  275.  
  276.                     /* End Range */
  277.                     if edmm = '##' then edmm = amm
  278.                     if eddd = '##' then eddd = add
  279.                     if edyy = '##' then edyy = ayy
  280.                     event.i.enddate = edmm'/'eddd'/'edyy
  281.                 end
  282.  
  283.                 a = b = 0
  284.                 sd = event.i.startdate
  285.                 edt = event.i.enddate
  286.                 parse var sd tmm'/'tdd'/'tyy
  287.                 sd = date(c,'19'tyy''tmm''tdd, S)
  288.                 parse var edt tmm'/'tdd'/'tyy
  289.                 edt = date(c,'19'tyy''tmm''tdd, S)
  290.                 currdt = date(usa)
  291.                 parse var currdt tmm'/'tdd'/'tyy
  292.                 currdt = date(c,'19'tyy''tmm''tdd, S)
  293.                 if currdt < sd then a = 1
  294.                 if currdt >= edt then b = 1
  295.                 if a = 1 | b = 1 then event.i.date = void_event
  296.                 drop sd edt currdt tmm tdd tyy a b
  297.             end
  298.     
  299.     /* ======= Final Routine == */
  300.  
  301.                if event.i.time = clock2 & event.i.date = date then
  302.                 address command 'run >NIL:' event.i.command event.i.pargs
  303.  
  304.             if event.i.time = clock2 & event.i.date = date & event.i.sfx ~= '' then do
  305.                 if exists('EZCron:prefs/sfx.prefs') then do
  306.                     call open(sfxconfig, 'EZCron:prefs/sfx.prefs', 'r')
  307.                     sfxplayer = readln(sfxconfig)
  308.                     call close(sfxconfig)
  309.                     address command 'run >nil:' sfxplayer event.i.sfx
  310.                 end
  311.             end
  312.             if event.i.time = clock2 & event.i.date = date & event.i.txt ~= "" then do
  313.                 address command 'run >nil: rx >nil: ezcron:rexx/Reminder.rexx' event.i.txt /*This calls the external rexx proggy for the event display */
  314.                 if showlist(h,SPEAK) then do
  315.                     address command 'echo' '"'event.i.txt'"' '>speak:'
  316.                 end
  317.             end
  318.             if event.i.time = clock2 & event.i.date = date
  319.             then event.i.date = 'Finished with Event'
  320.         end       /* end of 'do i = 1 to event.0' */
  321.     end             /* end of do forever */
  322.  
  323. /* ======== Error Handling == */
  324. syntax:
  325. ioerr:
  326. error:
  327.     errorrc = RC
  328.     if ~show('L','rexxreqtools.library') then call addlib('rexxsupport.library',0,-30)
  329.     call rtezrequest('EZCronD has exited with an error in event'||LF||event.i.command||LF||'Line' SIGL ERRORTEXT(errorrc),'Okay!','**EZCronD Fatal Error**','rt_reqpos = reqpos_centerscr rtez_flags=ezreqf_centertext',)
  330.     call exiting()
  331.  
  332. /* ======== Arexx Port Message Check == */
  333. aport:
  334.     cmd = getarg(Pkt)
  335.     if cmd = 'STOP' then do
  336.         call reply(Pkt, 0)
  337.         call exiting()
  338.     end
  339.  
  340. exiting:
  341.     call closeport('EZCROND')
  342.     if showlist('P', 'EZCRONPREFS') then address 'EZCRONPREFS' refresh
  343.     address command 'avail flush >NIL:'
  344.     exit
  345.